/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package br.com.krossk.jspControllers;


import br.com.krossk.dao.AreaDAO;
import br.com.krossk.dao.ArquivoDAO;
import br.com.krossk.dao.RepositorioDAO;
import br.com.krossk.jpa.JPAFactory;
import br.com.krossk.model.Area;
import br.com.krossk.model.Arquivo;
import br.com.krossk.model.Privilegio;
import br.com.krossk.model.Repositorio;
import br.com.krossk.model.Usuario;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.persistence.EntityManager;
import javax.persistence.Query;
import javax.servlet.http.HttpServletRequest;
import org.apache.pdfbox.pdfparser.PDFParser;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.util.PDFTextStripper;
import org.apache.poi.hslf.HSLFSlideShow;
import org.apache.poi.hslf.extractor.PowerPointExtractor;
import org.apache.poi.hssf.extractor.ExcelExtractor;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hwpf.extractor.WordExtractor;
import org.apache.poi.hwpf.HWPFDocument;

/**
 *
 * @author Henrique
 */
public class Pesquisa {
    private ArquivoDAO adao;
    private int idArea;
    private int idSegmento;
    private String palavra;
    private String conteudo;
    

    public Pesquisa(int idArea, int idSegmento,  String palavra) {
        this.adao = ArquivoDAO.getInstance();
        this.idArea = idArea;
        this.idSegmento = idSegmento;
        
    }

    public Pesquisa(HttpServletRequest request) {
        this.adao =  ArquivoDAO.getInstance();
        try{
            this.idArea = Integer.parseInt(request.getParameter("area"));
            this.idSegmento = Integer.parseInt(request.getParameter("segmento"));
            this.palavra = request.getParameter("palavra");
            this.conteudo = request.getParameter("buscaRegex");
            
        }catch(Exception ex){
            this.idArea=0;
            this.idSegmento=0;
            this.palavra = "";
            this.conteudo = "";
        }
        //this.ordenacao = ordenacao;
    }

    public List <Arquivo> getResult() throws IOException{
        List <Arquivo> lista = new ArrayList<Arquivo>();
        if(palavra==null||palavra.equals("")){
            lista =  adao.getAll();
        }else{
            EntityManager em = JPAFactory.getEntityManager();
            Query q = em.createQuery("SELECT p.arquivoCollection FROM PalavraChave p WHERE p.palavra LIKE :palavra");
            q.setParameter("palavra",palavra);
            lista = q.getResultList();
            em.close();
            
        }
        filterByArea(lista);
        filterBysegmento(lista);
        filterByContent(lista);
        
        return lista;
    }

     public List <Arquivo> getResult(Usuario usuario){
        List <Arquivo> lista = new ArrayList<Arquivo>();
        if(palavra==null||palavra.equals("")){
            lista =  adao.getAll();
        }else{
            EntityManager em = JPAFactory.getEntityManager();
            Query q = em.createQuery("SELECT p.arquivoCollection FROM PalavraChave p WHERE p.palavra LIKE :palavra");
            q.setParameter("palavra",palavra);
            lista = q.getResultList();
            em.close();

        }
        filterByArea(lista);
        filterBysegmento(lista);
        if(usuario.getPrivilegio().getIdPrivilegio()!=Privilegio.ADMINISTRADOR)
            filterByUsuario(lista, usuario.getIdUsuario());

        return lista;
    }
    

    public void filterByArea(List<Arquivo> lista) {
        if (idArea > 0) {
            Area a = AreaDAO.getInstance().getById(idArea);
            for (int i = 0; i < lista.size(); i++) {
                if (!lista.get(i).getAreaCollection().contains(a)) {
                    lista.remove(i);
                    i--;
                }
            }
        }
    }

    public void filterBysegmento(List<Arquivo> lista) {
        if (idSegmento > 0) {
            for (int i = 0; i < lista.size(); i++) {
                if (lista.get(i).getSegmento().getIdSegmento() != idSegmento) {
                    lista.remove(i);
                    i--;
                }
            }
        }
    }
    
    //Filtra o conteudo utilizando REGEX
    public void filterByContent(List<Arquivo> lista) throws IOException{

        String busca = this.conteudo;
        List<Arquivo> arqRem = new ArrayList<Arquivo>();

        for(Arquivo a : lista){
            String textContent = "";

            //Extrai texto de arquivos do word
            if(a.getTipoArquivo().equals("application/msword") ){
                Repositorio rep = RepositorioDAO.getInstance().getById(a.getIdArquivo());
                ByteArrayInputStream in = new ByteArrayInputStream(rep.getConteudo());
                HWPFDocument wdoc = new HWPFDocument(in);
                WordExtractor we = new WordExtractor(wdoc);
                textContent = we.getText();
         
            }

            //Extrai texto de apresentações (.ppt)
            if(a.getTipoArquivo().equals("application/vnd.ms-powerpoint")) {
                Repositorio rep = RepositorioDAO.getInstance().getById(a.getIdArquivo());
                ByteArrayInputStream in = new ByteArrayInputStream(rep.getConteudo());
                HSLFSlideShow sw = new HSLFSlideShow(in);
                PowerPointExtractor ppte = new PowerPointExtractor(sw);
                textContent = ppte.getText();
            }

            //Extrai texto de planilhas (.xls)
            if(a.getTipoArquivo().equals("application/vnd.ms-excel")){
                Repositorio rep = RepositorioDAO.getInstance().getById(a.getIdArquivo());
                ByteArrayInputStream in = new ByteArrayInputStream(rep.getConteudo());
                HSSFWorkbook wb = new HSSFWorkbook(in);
                ExcelExtractor excelEx = new ExcelExtractor(wb);
                textContent = excelEx.getText();
            }

            //Extrai texto dos arquivos (*.txt)
            if(a.getTipoArquivo().equals("text/plain")){
                int length;
                String strAux;
                
                Repositorio rep = RepositorioDAO.getInstance().getById(a.getIdArquivo());
                ByteArrayInputStream in = new ByteArrayInputStream(rep.getConteudo());
                length = in.available();
                byte [] buff = new byte[length];
                in.read(buff);
                
                strAux = new String(buff);
                textContent = strAux;
            }

            //Extrai texto dos arquivos PDF
            if(a.getTipoArquivo().equals("application/x-forcedownload")){
                Repositorio rep = RepositorioDAO.getInstance().getById(a.getIdArquivo());
                ByteArrayInputStream in = new ByteArrayInputStream(rep.getConteudo());
                PDDocument pdfDocument;
                PDFParser parser = new PDFParser(in);
                parser.parse();
                pdfDocument = parser.getPDDocument(); 
                PDFTextStripper stripper = new PDFTextStripper();
                textContent = stripper.getText(pdfDocument);
                pdfDocument.close();
            }
            
            if(!textContent.equals("")){
                Pattern pattern = Pattern.compile(busca, Pattern.CASE_INSENSITIVE);
                Matcher m = pattern.matcher(textContent);
                if(!m.find()){
                    arqRem.add(a);
                }
            }else{
                if(!busca.equals("")){
                    arqRem.add(a);
                }
            }

        }

        for(Arquivo a : arqRem){
            lista.remove(a);
        }

    }

    public void filterByUsuario(List<Arquivo> lista, int idUsuario) {
        if (idUsuario != 0) {
            for (int i = 0; i < lista.size(); i++) {
                if (lista.get(i).getUsuario().getIdUsuario() != idUsuario) {
                    lista.remove(i);
                    i--;
                }
            }
        }
    }

    public int getIdArea() {
        return idArea;
    }

    

    public int getIdSegmento() {
        return idSegmento;
    }

    public String getPalavra() {
        return palavra;
    }

    public String getConteudo(){
        return conteudo;
    }
    
}
